Memento
객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원할 수 있는 패턴
- 객체 내부 상태정보만 가지는 클래스를 따로 생성하여 관리하는 구조
- 저장할 상태정보가 많을 경우 성능에 문제가 될 수 있음
다이어그램
예제 및 이해
- CareTaker에서 Stack을 가지고 상태를 저장해서 이전 상태로 돌리게 하였습니다.
- 특정 상태로 돌아가고자 한다면 다른 형태(List)를 사용해 index를 이용해도 됩니다.
- Stack을 Pop해서 가져와 이전으로 돌아가면서 현재 상태는 삭제 되도록 하였습니다.
- Originator의 saveStateToMemento을 통해 현재 state를 Memento에 저장하고 해당 Memento 객체를 return 합니다.
- Originator의 getStateFromMemento을 통해 Memento 객체를 받아 현재 state를 Memento 객체에서 받아옵니다.
Memento
Originator
CareTaker
Main
출력
=======상태 저장=======
01 상태
02 상태
03 상태
=======이전 상태 호출=======
03 상태
02 상태
01 상태
저장된 상태를 FILO 형태로 받아옵니다.
어쨌든 상태를 stack에 저장하기 때문에 저장 공간이 많이 사용될 수 있습니다.
장단점
장점
- 핵심 객체의 정보를 캡슐화 된 상태로 유지할 수 있습니다.
- 저장된 상태를 다른 별도의 객체에 보관하기 때문에 안전합니다.
- 복구 기능을 쉽게 구현할 수 있습니다.
단점
- 상태를 저장하고 복구하는데 시간이 오래 걸릴 수 있습니다.
- 상태를 저장하기 위해 메멘토 객체를 이용해야 합니다.
- 자바 시스템에서는 시스템의 상태를 저장할 때 직렬화를 사용하는 것이 좋습니다.
참조
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.